home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
cat
/
msginfil.i
< prev
next >
Wrap
Text File
|
1997-10-26
|
36KB
|
1,010 lines
IMPLEMENTATION MODULE MsgInfile;
(*==============================================================*
* Modul: CAT-Infilehandler, dritte Version *
* Autor: Dirk Steins *
* erstellt am: 29.10.1992 *
* letzte nderung am: 26.12.1992 *
* Version: 0.7 *
* Interne Version: V#0007 *
*==============================================================*
Dieses Modul erstellt neue Nachrichten, managt diese und verwaltet die neuen
Nummern und erstellt auch das Infile.
Es wird fr jede Nachricht ein Typ festgelegt, und in den HDR-Dateien zu jeder
Message werden alle Informationen festgehalten, so da jederzeit eine nderung
in einen anderen Messagetyp mglich ist.
Die Infos im Speicher zu den Messages werden in einem dynamischen Array fest-
gehalten, das passend alloziert wird.
Die Header-Dateien bestehen aus 7 Textzeilen, die folgende Informationen
enthalten:
Eingabedatum im MausTausch-Format (E-Zeile)
Empfnger (fr Persnliche Nachrichten) (A-Zeile)
Ursprungsgruppe (Leer fr Antworten auf pers. Nachrichten)
Zielgruppe (Leer fr persnliche Nachrichten) (G-Zeile)
Referenznummer (kommentierte ID) (- Zeile)
Stichwort (W-Zeile)
Original-ID der kommentierten Nachricht (MId) (R-Zeile)
Wenn der Typ der Nachrichten nicht gendert wird, dann knnen einige Zeilen
auch leer sein. Immer gefllt ist nur die Datumszeile!
Beim Erstellen des Infiles werden evtl. vorhandene Tabulatoren in den
Messages in Leerzeichen gewandelt.
Ob Endloszeilen an die Maus geschickt werden oder nicht, ist einstellbar.
*----------------------------------------------------------------------------
* Datum Vers. Autor nderung (Arbeitsbericht)
*----------------------------------------------------------------------------
* 29.10.92 0001 DS Erste Version
* 02.11.92 0002 DS Luft recht stabil, Fenster ist auch schon da,
* editieren geht auch schon.
* 02.11.92 0003 DS Fenster funktioniert, Buttons im Fenster auch,
* alle Features implementiert!
* 10.11.92 0004 DS Bugs korrigiert. Distribution eingebaut.
* Erweiterungen fr Maus 9 eingebaut: D-Zeile
* 26.12.92 0006 DS Distribution auch ber Popup im Editor und ber Buttons
* einstellbar.
* 10.03.93 0007 DS Datum wird in ID fr die Maus mit eincodiert und auch
* beim identifizieren berprft.
* 15.07.95 0008 DS Modul aufgespalten in drei Module fr Port auf HM2
* Dieser Part erstellt nur noch das Infile. Der Zugriff
* auf die Strukturen und Daten erfolgt ber ein anderes
* Modul
*
*
*----------------------------------------------------------------------------
*)
FROM SYSTEM IMPORT TSIZE, ADDRESS, ADR, CALLSYS, CADR, BYTE, ASSEMBLER, LOC;
(* MM2-Module *)
IMPORT Block, Strings, StrConv, GrafBase, BinOps, MOSGlobals,
Keyboard, Characters;
FROM Keyboard IMPORT SpecialCode;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
(* Magic-Module *)
IMPORT MagicAES, MagicVDI, MagicDOS, MagicFSM, mtTextfiles, mtAlerts, mtAppl,
mtUtils, mtDials, mtPopups, MagicXBIOS, MagicStrings;
FROM MagicSys IMPORT Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7,
Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14, Bit15;
IMPORT Mintbind;
(* CAT-Module *)
IMPORT ARCStarter, CatFiles, CatTypes, MTE, MTEdit2,
CatEdit, FontSelect, WdwManager, VDIStandards, ConfVars,
CatGlobal, EditTypes, MausTauschrsc, grinTools, ListHelp,
grin, data, dataSys, QuickSort, Varnames, Infofiles, RectFuncs,
GroupSelect, IoFilter, WinDials, Protokoll;
FROM CatGlobal IMPORT OpenName;
FROM MTPaths IMPORT MessagePath, DataPath, ExportPath, ImportPath, ARCName;
IMPORT ConvertDate;
FROM UserInformation IMPORT UserBLK, batchProcess;
FROM Void IMPORT v;
IMPORT Messages, MsgWindow;
FROM Messages IMPORT MessageType;
CONST
saveSize = 40L; (* Sicherheitsgrenze beim Splitten von Nachrichten *)
infile = 'infile.txt'+0C;
devGroup = 'MT.CAT.DEV'+0C;
PROCEDURE Transfer(InHandle, INFILE : mtTextfiles.TEXTFILE; c : CHAR);
VAR str : ARRAY[0..2047] OF CHAR;
outStr : ARRAY [0..2047] OF CHAR;
ch : CHAR;
newLine : BOOLEAN;
BEGIN
newLine := TRUE;
REPEAT
mtTextfiles.ReadLine (InHandle, str);
mtTextfiles.ReadChar (InHandle, ch); (* Liest Ende-Zeichen der Zeile *)
CatGlobal.ConvertTabs (str, outStr, UserBLK.tabSize);
(* Blockschutz wie JellyCat *)
IF Characters.IsSpace (str[0]) & ~newLine
THEN
mtTextfiles.WriteLn (INFILE);
newLine := TRUE;
END;
IF newLine THEN
IF c # 0C THEN
mtTextfiles.WriteChar(INFILE, ':')
END;
newLine := FALSE;
END;
mtTextfiles.WriteLine (INFILE, outStr); (* Zeile ausgeben *)
IF (ch = 15C) (* CR *) OR mtTextfiles.EndofText (InHandle)
OR ~UserBLK.endlessLines
THEN
(* Richtiges Zeilenende *)
mtTextfiles.WriteLn (INFILE);
newLine := TRUE;
IF ch = 15C THEN mtTextfiles.ReadLn(InHandle); END;
END;
UNTIL mtTextfiles.EndofText (InHandle);
END Transfer;
PROCEDURE TrickyOpen(REF p, n : ARRAY OF CHAR; mode : mtTextfiles.Textmode;
buff : CARDINAL; VAR f : mtTextfiles.TEXTFILE):BOOLEAN;
VAR fn : CatTypes.String255;
BEGIN
Strings.Assign(p, fn, v.bool);
Strings.Append(n, fn, v.bool);
RETURN
mtTextfiles.OpenTextfile(fn, mode, buff, f) (* OR
(* Bei Buffergre = 0 wird ein 32 kB buffer genommen, das klappt dann
* noch weniger, daher nehmen wir jetzt einen 512 Byte Buffer, die sollten
* immer frei sein
*)
mtTextfiles.OpenTextfile(fn, mode, 512, f); *)
END TrickyOpen;
PROCEDURE splitMessage (VAR idx : INTEGER; msg: Messages.msgInfo);
VAR tmp : Messages.msgInfo;
orgGroup,
msgName,
tmpName : CatTypes.String255;
numExtension: CatTypes.extStrType;
msgNum : INTEGER;
i,
pNumber : CARDINAL;
source,
tmpFile : mtTextfiles.TEXTFILE;
bCount : LONGCARD;
str,
outStr : CatTypes.String1023;
ch : CHAR;
tmpMsg : Messages.msgInfo;
refName : CatTypes.nameStrType;
newType : Messages.MessageType;
orgHasCopies: BOOLEAN;
orgMsg : Messages.msgInfo;
count,
tmpCount : INTEGER;
j : INTEGER;
PROCEDURE makeTmpName (msgNum : INTEGER; number : CARDINAL);
BEGIN
Strings.Assign (StrConv.NumToStr (number, 36, 3, '0'), numExtension, v.bool);
Messages.Number2Name (msgNum, tmpName);
Strings.Append ('.', tmpName, v.bool);
Strings.Append (numExtension, tmpName, v.bool);
END makeTmpName;
PROCEDURE readSourceLine();
BEGIN
mtTextfiles.ReadLine (source, str);
mtTextfiles.ReadChar (source, ch); (* Liest Ende-Zeichen *)
IF ch = 15C THEN mtTextfiles.ReadLn (source); END;
CatGlobal.ConvertTabs (str, outStr, UserBLK.tabSize);
END readSourceLine;
PROCEDURE writeTargetLine();
BEGIN
INC (bCount, LENGTH (outStr));
mtTextfiles.WriteLine (tmpFile, str); (* str schreiben, nicht die ohne Tabs! *)
IF (ch = 15C) OR mtTextfiles.EndofText (source) (* CR da oder EndOfText *)
THEN
mtTextfiles.WriteLn (tmpFile); (* CR/LF schreiben *)
INC (bCount, 2); (* Zwei Bytes geschrieben *)
ELSE
mtTextfiles.WriteChar (tmpFile, 12C); (* LF schreiben *)
INC (bCount);
END;
END writeTargetLine;
PROCEDURE updateMsgSize (VAR msg : Messages.msgInfo);
VAR idx2 : INTEGER;
BEGIN
msg.size := Messages.FileSize (MessagePath, msgName, v.card, v.card);
msg.new := FALSE;
idx2 := Messages.FindMessage (msg.number);
IF idx2 >= 0 THEN Messages.msgArray^[idx2] := msg; END;
END updateMsgSize;
PROCEDURE buildSubject (REF inTopic: ARRAY OF CHAR;
VAR outTopic: ARRAY OF CHAR;
part: CARDINAL);
(* Hngt einen String (x/y) an den Betreff an *)
VAR num: ARRAY [0..79] OF CHAR;
maxLen : CARDINAL;
BEGIN
Strings.Assign (inTopic, outTopic, v.bool);
Strings.Assign (" (", num, v.bool);
Strings.Append (StrConv.CardToStr (part, 0), num, v.bool);
Strings.Append ("/", num, v.bool);
Strings.Append (StrConv.CardToStr (pNumber, 0), num, v.bool);
Strings.Append (")", num, v.bool);
Strings.Append (num, outTopic, v.bool);
END buildSubject;
PROCEDURE updateSubject (VAR msg: Messages.msgInfo; REF subj: ARRAY OF CHAR);
BEGIN
WITH msg DO
IF topic # NIL THEN DEALLOCATE (topic, 0); END;
ALLOCATE (topic, LENGTH (subj)+2);
IF topic = NIL
THEN
HALT
END;
Strings.Assign (subj, topic^, v.bool);
Messages.WriteHdrInfo (msg);
END;
END updateSubject;
BEGIN
(* Das wird jetzt wirklich Arbeit: Eine Message
* an der richtigen Stelle aufsplitten
*)
(* Vorgehensweise: Damit die Nachrichten alle hintereinander eingefgt
* werden, mssen die auch hintereinander im Messagearray stehen.
* Die Nummern mssen aber nicht aufeinanderfolgend sein!
* Deshalb wird die Originalnachricht an das Ende des Messagearrays kopiert
* bzw. der Eintrag ausgetauscht, und dann werden weitere
* Nachrichten hinten dran gehngt.
*)
(* Erst mal im Messagearray tauschen *)
IF ~msg.hdrRead
THEN
Messages.ReadHdrInfo (msg, TRUE);
END;
IF ~msg.hdrRead
THEN
RETURN ;
END;
tmp := Messages.msgArray^[Messages.messages-1];
Messages.msgArray^[Messages.messages-1] := msg;
Messages.msgArray^[idx] := tmp;
orgHasCopies := msg.copyCount > 0;
orgMsg := msg;
DEC (idx);
(* Jetzt Namen zusammensetzen *)
Messages.Number2Name (msg.number, msgName);
Strings.Append (CatTypes.textExt, msgName, v.bool);
(* Jetzt wird die Originalnachricht in Files unterteilt,
* die eine durchnummerierte Extension haben, also .001, .002 etc.
*)
pNumber := 1;
IF TrickyOpen (MessagePath, msgName, mtTextfiles.READ, 16384, source)
THEN
(* Damit es nicht so schnell zu einem berlauf der Extension kommt,
* wird diese im 36er-System kodiert.
*)
makeTmpName(msg.number, pNumber);
IF ~TrickyOpen (MessagePath, tmpName, mtTextfiles.WRITE, 16384, tmpFile)
THEN
(* Fehlermeldung ausgeben und abbrechen, alle tmp-Files wieder lschen *)
MTE.info (MTE.noTmpSplitFile);
mtTextfiles.CloseTextfile (source);
RETURN
END;
bCount := 0;
WHILE ~mtTextfiles.EndofText (source) DO
readSourceLine();
WHILE ~mtTextfiles.EndofText (source) & (bCount + LONG(LENGTH (outStr)) + saveSize < LONGCARD(UserBLK.splitSize)) DO
writeTargetLine();
readSourceLine();
END;
IF bCount + LONG(LENGTH (outStr)) + saveSize < LONGCARD(UserBLK.splitSize)
THEN
(* noch rausschreiben *)
writeTargetLine();
ELSE
(* Gre berschritten! Also tmpFile schlieen und neues anlegen! *)
mtTextfiles.CloseTextfile (tmpFile);
INC (pNumber);
IF pNumber = 46656
THEN
(* Damit wrde die dritte Stelle in der Extension
* berschritten und ein berlauf auftreten.
* Dieser Fall ist aber sehr unwahrscheinlich, da
* man dazu eine Message von ca. 560 MB schreiben mte!
* Vorher ist wahrscheinlich die Platte voll oder Fehler
* sind aufgetreten.
*)
HALT
END;
makeTmpName(msg.number, pNumber);
IF ~TrickyOpen (MessagePath, tmpName, mtTextfiles.WRITE, 16384, tmpFile)
THEN
(* Fehlermeldung ausgeben und abbrechen, alle tmp-Files wieder lschen *)
MTE.info (MTE.noTmpSplitFile);
FOR i := 1 TO pNumber - 1 DO
Strings.Assign (StrConv.NumToStr (i, 36, 3, '0'), numExtension, v.bool);
Messages.Number2Name (msg.number, tmpName);
Strings.Append ('.', tmpName, v.bool);
Strings.Append (numExtension, tmpName, v.bool);
v.bool := CatFiles.DeleteFile (MessagePath, tmpName);
END;
mtTextfiles.CloseTextfile (source);
RETURN
END;
(* noch rausschreiben *)
bCount := 0;
writeTargetLine();
END;
END;
(* jetzt haben wir die Nachricht verteilt in pNumber temporre Files *)
mtTextfiles.CloseTextfile (tmpFile);
mtTextfiles.CloseTextfile (source);
ELSE
(* Fehlermeldung *)
MTE.info (MTE.noMsgSplitFile);
RETURN
END;
(* Jetzt werden die Dateien umbenannt und viele neue Kommentare angelegt *)
v.bool := CatFiles.DeleteFile (MessagePath, msgName);
i := 1;
makeTmpName (msg.number, 1);
v.bool := CatFiles.RenameFile (MessagePath, tmpName, MessagePath, msgName);
INC (i);
msgNum := msg.number;
updateMsgSize (msg);
IF msg.topic # NIL
THEN
Strings.Assign (msg.topic^, str, v.bool);
ELSE
Strings.Assign ("(no Subject)", str, v.bool);
END;
buildSubject (str, outStr, 1);
updateSubject (msg, outStr);
Messages.UpdateEditors (msg);
IF (msg.msgType = answer) OR (msg.msgType = persanswer) OR (msg.msgType = private)
THEN
(* persnliche Nachricht gleichen Typs anlegen *)
newType := msg.msgType;
ELSE
(* Kommentar auf eigene Nachricht anlegen *)
newType := comment;
END;
WHILE i <= pNumber DO
Messages.ReadHdrInfo (msg, TRUE);
IF ~msg.hdrRead
THEN
RETURN;
END;
IF msg.msgType # answer
THEN
Messages.MakeMausId (msg, refName);
ELSE
Strings.Assign (msg.refId^, refName, v.bool);
END;
IF LENGTH(msg.orgGroup^) > 0
THEN
MagicStrings.Assign (msg.orgGroup^, orgGroup);
ELSE
MagicStrings.Assign (msg.group^, orgGroup);
END;
buildSubject (str, outStr, i);
IF Messages.CreateMessage (msg.number, msg.receiver^, orgGroup, msg.group^, refName, outStr,
msg.realName^, newType, 0, '', '', msg.dist, FALSE, v.int)
THEN
msg := Messages.msgArray^[Messages.messages-1];
Messages.Number2Name (msg.number, msgName);
Strings.Append (CatTypes.textExt, msgName, v.bool);
makeTmpName (msgNum, i);
v.bool := CatFiles.RenameFile (MessagePath, tmpName, MessagePath, msgName);
updateMsgSize (msg);
IF orgHasCopies
THEN
FOR count := 1 TO orgMsg.copyCount DO
(* Kopie Nr. j suchen und dann zur gerade erstellten wieder
* eine Kopie anlegen mit den gleichen Daten
*)
FOR j := 0 TO Messages.messages - 1 DO
tmpCount := 1;
IF (Messages.msgArray^[j].msgType = copyOwn)
& (Messages.msgArray^[j].refNum = orgMsg.number)
& Messages.msgArray^[j].sendMsg
THEN
IF tmpCount = count
THEN
(* Richtige Kopie gefunden, Kopie zu msg anlegen *)
IF ~Messages.msgArray^[j].hdrRead
THEN
Messages.ReadHdrInfo (Messages.msgArray^[j], FALSE);
IF ~Messages.msgArray^[j].hdrRead
THEN
RETURN;
END;
END;
Messages.Number2Name (msg.number, msgName);
Strings.Assign (Messages.msgArray^[j].topic^, str, v.bool);
buildSubject (str, outStr, i);
Messages.CopyOwnMessage (msgName, Messages.msgArray^[j].receiver^, Messages.msgArray^[j].realName^, outStr, j);
IF i = pNumber
THEN
(* Kommentare der Originalkopien auch anpassen
*)
IF Messages.msgArray^[j].topic # NIL
THEN
Strings.Assign (Messages.msgArray^[j].topic^, str, v.bool);
ELSE
Strings.Assign ("(no Subject)", str, v.bool);
END;
buildSubject (str, outStr, 1);
updateSubject (Messages.msgArray^[j], outStr);
END;
ELSE
INC (tmpCount);
END;
END;
END;
END;
END;
(* Jetzt erst i updaten, da wir ansonsten evtl. eine falsche
* Nummer ins Stichwort schreiben
*)
INC (i);
ELSE
RETURN
END;
END;
END splitMessage;
PROCEDURE LineOut (file : mtTextfiles.TEXTFILE; ch : ARRAY OF CHAR; REF str : ARRAY OF CHAR);
BEGIN
IF ch[0] # 0C THEN mtTextfiles.WriteLine (file, ch); END;
mtTextfiles.WriteLine (file, str);
mtTextfiles.WriteLn (file);
END LineOut;
PROCEDURE CalcPercent (val: LONGCARD; mul, div: LONGCARD): LONGCARD;
BEGIN
IF val < (MAX(LONGCARD) DIV mul)
THEN
RETURN (val * mul) DIV div;
ELSE
RETURN (val DIV div) * mul;
END;
END CalcPercent;
PROCEDURE GetFreeSpace (VAR num : ARRAY OF CHAR);
VAR mFree, iFree : LONGCARD;
dInfo : MagicDOS.DISKINFO;
packed : BOOLEAN;
sameDrive : BOOLEAN;
BEGIN
(* Platz auf Data- und Import-Laufwerk holen *)
(* MagicDOS.Dfree (dInfo, ORD (CAP(DataPath[0])) - ORD('A') + 1); *)
CatGlobal.PathFree (dInfo, DataPath);
mFree := dInfo.bFree * dInfo.bSecsiz * dInfo.bClsiz;
sameDrive := CAP(DataPath[0]) = CAP(ImportPath[0]);
IF ~sameDrive
THEN
(* MagicDOS.Dfree (dInfo, ORD (CAP(ImportPath[0])) - ORD('A') + 1); *)
CatGlobal.PathFree (dInfo, ImportPath);
iFree := dInfo.bFree * dInfo.bSecsiz * dInfo.bClsiz;
END;
packed := ARCName[0] # '';
(* Jetzt haben wir vier Flle:
* 1. gepackt und gleiches Laufwerk : min ((xarc*.30)+xarc+xarc*1.2) xarc = free / 2.5 =>>> arc = 12% free!
* 2. gepackt und unterschiedliche Laufwerke : min (80% mDrv, (xarc*.3) + xarc) xarc = free / 1.3
* 3. ungepackt und gleiches Laufwerk : 80% von min (iDrv, mDrv) / 2 ==>> (free / 2.5)
* 4. ungepackt und unterschiedliche Laufwerke : min (90% iDrv, 80% mDrv)
*)
IF packed
THEN
IF sameDrive
THEN
(* Nur 12% insgesamt fr Archiv verfgbar *)
mFree := CalcPercent (mFree, 2, 7); (* (mFree * 2) DIV 7; *)
ELSE
(* Minimum von 80% Databaselaufwerk, 23% Importlaufwerk *)
mFree := BinOps.LowerLCard (CalcPercent (mFree, 8, 10), CalcPercent (iFree, 10, 15));
(* mFree := BinOps.LowerLCard ((mFree * 8) DIV 10, (iFree * 10) DIV 15); *)
END;
ELSE
IF sameDrive
THEN
(* 80% von freier Platz/2 *)
mFree := CalcPercent (mFree, 2, 5); (* mFree := (mFree * 2) DIV 5; *)
ELSE
(* Minimum von 90% Importlaufwerk, 80% Databaselaufwerk *)
mFree := BinOps.LowerLCard (CalcPercent (mFree, 8, 10), CalcPercent (iFree, 9, 10));
(* mFree := BinOps.LowerLCard ((mFree * 8) DIV 10, (iFree * 9) DIV 10); *)
END;
END;
Strings.Assign (StrConv.CardToStr (mFree, 0), num, v.bool);
END GetFreeSpace;
PROCEDURE SetHeaderLine (VAR msg: Messages.msgInfo; line: Messages.lineType; REF str: ARRAY OF CHAR);
VAR oldPtr: CatTypes.Str1023Ptr;
BEGIN
WITH msg DO
oldPtr := strings[line];
ALLOCATE (strings[line], LENGTH(str)+2);
IF strings[line] = NIL
THEN
IF LENGTH (str) <= LENGTH (oldPtr^)
THEN
strings[line] := oldPtr;
oldPtr := NIL;
END;
END;
IF strings[line] # NIL
THEN
MagicStrings.Assign (str, strings[line]^);
ELSE
MTE.noMemAlert();
END;
IF oldPtr # NIL
THEN
DEALLOCATE (oldPtr, 0);
END;
END;
END SetHeaderLine;
PROCEDURE MakeInFile(): BOOLEAN;
VAR InHandle,
INFILE : mtTextfiles.TEXTFILE;
res : INTEGER;
i, j : INTEGER;
numStr : CatTypes.String255;
msg : Messages.msgInfo;
alt,
tmpName,
msgName : CatTypes.String255;
msgSize : LONGCARD;
isDa : BOOLEAN;
cDt,
cTi : CARDINAL;
dt : ConvertDate.Date;
ti : ConvertDate.Time;
userCmds : BOOLEAN;
itkCmds : BOOLEAN;
itkCmdMax: INTEGER;
itkCmdVal: CatTypes.Str1023Ptr;
BEGIN
(* Pre-Messages Filter aufrufen *)
isDa := FALSE;
IF IoFilter.IoFilterMessage(isDa)
THEN
Messages.ReReadMessageInfo ();
ELSIF isDa
THEN
(* Fehler aufgetreten *)
mtAppl.MouseArrow();
RETURN FALSE;
END;
(* Jetzt Infile.txt erstellen *)
IF ARCName[0] = 0C THEN
IF ~TrickyOpen(ExportPath, infile, mtTextfiles.WRITE, 16384, INFILE) THEN
mtAppl.MouseArrow();
MTE.InfoAlert (MTE.noFile1, infile, MTE.noFile3);
RETURN FALSE;
END;
ELSE
IF ~TrickyOpen(MessagePath, infile, mtTextfiles.WRITE, 16384, INFILE) THEN
mtAppl.MouseArrow();
MTE.InfoAlert (MTE.noFile1, infile, MTE.noFile3);
RETURN FALSE
END;
END;
CatGlobal.busyMouse();
itkCmds := ConfVars.GetConfigInt (cItkCmdMax, itkCmdMax);
userCmds := FALSE;
IF TrickyOpen(MessagePath, CatTypes.userCmdFile, mtTextfiles.READ, 2048, InHandle) THEN
userCmds := TRUE;
mtTextfiles.CloseTextfile(InHandle);
END;
IF UserBLK.getPer OR UserBLK.getAllg OR UserBLK.getInf OR itkCmds OR userCmds THEN
mtTextfiles.WriteConst(INFILE, '#CMD'); mtTextfiles.WriteLn(INFILE);
IF UserBLK.groupChangeToIn THEN (* zuerst die Gruppenummeldungen *)
isDa := GroupSelect.GetGroupChange (numStr, GroupSelect.GFIRST);
WHILE isDa DO
LineOut (INFILE, ':G', numStr);
isDa := GroupSelect.GetGroupChange (numStr, GroupSelect.GNEXT);
END;
(* So, und das hier mu trotzdem da bleiben, da man sonst keine User mehr
* eintragen kann!
*)
IF TrickyOpen(MessagePath, CatTypes.grSelect, mtTextfiles.READ, 2048, InHandle) THEN
Transfer(InHandle, INFILE, 0C);
mtTextfiles.CloseTextfile(InHandle);
END;
END;
IF UserBLK.getPer THEN
LineOut (INFILE, '', ':PN');
(*
IF ConfVars.GetConfigBool (cUseLongIDs, v.bool) & v.bool
THEN
LineOut (INFILE, '', ':TI');
END;
*)
ConfVars.GetConfDefBool (cSendPsn, v.bool, TRUE);
IF v.bool
THEN
LineOut (INFILE, '', ':PSN');
ELSE
LineOut (INFILE, '', ':PSA');
END;
END;
IF UserBLK.getOwnPers
THEN
LineOut (INFILE, '', ':PE');
END;
IF UserBLK.getAllg THEN
LineOut (INFILE, '', ':ON');
END;
(* Rename-Infos anfordern *)
LineOut (INFILE, '', ':REN');
(* Maximallnge einstellen *)
ConfVars.GetConfDefBool (cMemLine, v.bool, TRUE);
IF v.bool
THEN
GetFreeSpace (numStr);
mtTextfiles.WriteConst (INFILE, ':M');
mtTextfiles.WriteLine (INFILE, numStr);
mtTextfiles.WriteLn (INFILE);
END;
IF UserBLK.getInf THEN
Infofiles.LoadInfoInf(FALSE, FALSE);
isDa := Infofiles.GetInfoCrc (numStr, Infofiles.IFIRST);
WHILE isDa DO
LineOut (INFILE, ':', numStr);
isDa := Infofiles.GetInfoCrc (numStr, Infofiles.INEXT);
END;
END;
IF itkCmds
THEN
ALLOCATE (itkCmdVal, TSIZE (CatTypes.String1023));
IF itkCmdVal # NIL
THEN
FOR i := 0 TO itkCmdMax DO
MagicStrings.Assign (cItkCmd, tmpName);
MagicStrings.Append (StrConv.IntToStr (i,0), tmpName);
IF ConfVars.GetConfigString (tmpName, itkCmdVal^)
THEN
(* Kommando vorhanden *)
(* Kommandoversion wird nicht abgefragt und verglichen, da ITK
* momentan nicht im Speicher
*)
LineOut (INFILE, ':', itkCmdVal^);
END;
END;
DEALLOCATE (itkCmdVal, 0);
END;
END;
IF TrickyOpen(MessagePath, CatTypes.userCmdFile, mtTextfiles.READ, 2048, InHandle) THEN
Transfer(InHandle, INFILE, 0C);
mtTextfiles.CloseTextfile(InHandle);
END;
END;
FOR i := 0 TO Messages.messages - 1 DO
Messages.msgArray^[i].isSend := FALSE;
Messages.msgArray^[i].selected := FALSE;
END;
MsgWindow.MsgDeselectAll();
IF UserBLK.statusToIn
THEN
(* zuerst die Statusmeldungen *)
IF TrickyOpen(MessagePath, CatTypes.statusInf, mtTextfiles.READ, 2048, InHandle) THEN
Transfer(InHandle, INFILE, 0C);
mtTextfiles.CloseTextfile(InHandle);
END;
(* Jetzt die Statusmeldungen fr kopierte oder weitergeleitete Messages *)
FOR i := 0 TO Messages.messages - 1 DO
CatGlobal.busyMouse();
msg := Messages.msgArray^[i];
IF msg.sendMsg & ~msg.toDelete &
((msg.msgType = copyOther) OR (msg.msgType = forward))
THEN
IF ~msg.hdrRead
THEN
Messages.ReadHdrInfo (msg, TRUE);
(* Messages.msgArray^[i] := msg; *)
END;
IF msg.hdrRead
THEN
LineOut (INFILE, '#', msg.refId^);
mtTextfiles.WriteChar (INFILE, 'B');
IF msg.msgType = forward THEN
mtTextfiles.WriteChar (INFILE, 'W');
ELSE
mtTextfiles.WriteChar (INFILE, 'K');
END;
mtTextfiles.WriteLn (INFILE);
LineOut (INFILE, 'K', msg.receiver^);
IF (msg.topic # NIL) &
(LENGTH (msg.topic^) > 0)
THEN
LineOut (INFILE, '>', msg.topic^);
END;
msg.isSend := TRUE;
Messages.msgArray^[i] := msg;
ELSE
END;
END;
END;
END;
IF UserBLK.messToIn THEN
(* Jetzt die einzelnen Messages der Reihe nach transferieren.
* Wenn eine zu gro werden wrde (Grenze: 14 kB, da Tabs!),
* dann wird nachgefragt, ob die Nachricht automatisch
* gesplittet werden soll, andernfalls wird die nicht versandt!
*)
i := 0;
WHILE i < Messages.messages DO
msg := Messages.msgArray^[i];
IF msg.sendMsg & ~msg.toDelete & ~msg.isSend &
(msg.msgType # copyOwn)
THEN
CatGlobal.busyMouse();
(* Erst mal testen, ob die Mail zu gro wrde *)
Messages.Number2Name (msg.number, msgName);
Strings.Append (CatTypes.textExt, msgName, v.bool);
msgSize := Messages.FileSize (MessagePath, msgName, cDt, cTi);
IF (UserBLK.splitSize > 0) & (msgSize > VAL(LONGCARD, UserBLK.splitSize))
THEN
IF UserBLK.autoSplit
THEN
res := 1;
ELSE
IF ~batchProcess
THEN
Strings.Assign (MTE.splitMsgAlt1, alt, v.bool);
Messages.Number2Name (msg.number, tmpName);
Strings.Append (tmpName, alt, v.bool);
Strings.Append (MTE.splitMsgAlt2, alt, v.bool);
res := mtAlerts.Alert (1, alt);
ELSE
res := 2
END;
END;
IF res = 1
THEN
splitMessage (i, msg);
ELSE
msg.sendMsg := FALSE;
Messages.msgArray^[i] := msg;
END;
END;
END;
INC(i);
END; (* WHILE *)
Messages.SortMessages();
(* Und jetzt die Messages alle ins Infile packen *)
FOR i := 0 TO Messages.messages - 1 DO
msg := Messages.msgArray^[i];
IF msg.sendMsg & ~msg.isSend &
(msg.msgType # copyOwn)
THEN
CatGlobal.busyMouse();
(* Headerinfo schreiben *)
IF ~msg.hdrRead
THEN
Messages.ReadHdrInfo (msg, TRUE);
(* Messages.msgArray^[i] := msg; *)
END;
IF msg.hdrRead
THEN
(* Zuerst wird die Message-ID geschrieben *)
Messages.Number2Name (msg.number, msgName);
(* Jetzt Id fr Maus erstellen *)
Messages.MakeMausId (msg, tmpName);
(* So, und jetzt ab ins Infile damit *)
LineOut (INFILE, '#', tmpName);
(* Jetzt kommen die weiteren Infos *)
CASE msg.msgType OF
groupcomment,
mail : LineOut (INFILE, 'G', msg.group^); |
persanswer,
private : LineOut (INFILE, 'A', msg.receiver^); |
answer : IF ~msg.noRefLine
THEN
LineOut (INFILE, '-', msg.refId^);
LineOut (INFILE, 'A', msg.receiver^);
ELSE
LineOut (INFILE, 'A', msg.receiver^);
END; |
comment : IF ~msg.noRefLine
THEN
LineOut (INFILE, '-', msg.refId^);
LineOut (INFILE, 'G', msg.group^);
ELSE
LineOut (INFILE, 'G', msg.group^);
END; |
ELSE
END (* CASE *);
IF (msg.topic # NIL)
& (LENGTH(msg.topic^) > 0)
THEN
LineOut (INFILE, 'W', msg.topic^);
END;
IF UserBLK.messDateToIn
THEN
(* Datum der Nachricht nehmen *)
Messages.Number2Name (msg.number, msgName);
Strings.Append (CatTypes.textExt, msgName, v.bool);
v.lint := Messages.FileSize (MessagePath, msgName, cDt, cTi);
(* Die Infos haben wir oben schon geholt *)
(* Jetzt Datum bauen *)
ConvertDate.MakeFreeDate (cDt, cTi, alt);
(* E-Zeile in Header sichern *)
SetHeaderLine (msg, Messages.dateL, alt);
Messages.WriteHdrInfo (msg);
(* und ausgeben in Infile *)
LineOut (INFILE, 'E', alt);
ELSE
ConvertDate.MakeDate (alt);
(* E-Zeile in Header sichern *)
SetHeaderLine (msg, Messages.dateL, alt);
(*
MagicStrings.Assign (alt, msg.date^);
*)
Messages.WriteHdrInfo (msg);
(* und ausgeben in Infile *)
LineOut (INFILE, 'E', alt);
END;
(* Reference-ID *)
IF (msg.rId # NIL)
& (LENGTH(msg.rId^) > 0)
THEN
(* RId bekommt keine <> mehr drumherum
IF (msg.rId^[0] # '<')
THEN
tmpName := '<';
Strings.Append (msg.rId^, tmpName, v.bool);
Strings.Append ('>', tmpName, v.bool);
LineOut (INFILE, 'R', tmpName);
ELSE
*)
LineOut (INFILE, 'R', msg.rId^);
(*
END;
*)
ELSIF (msg.msgType = groupcomment) & (msg.refId # NIL)
THEN
(* Ein Gruppenkommentar bekommt auch dann eine R-Zeile,
* wenn gar keine I-Zeile da war. Dann nehmen wir die normale Id!
*)
(* RId bekommt keine <> mehr drumherum
*
IF (msg.refId^[0] # '<')
THEN
tmpName := '<';
Strings.Append (msg.refId^, tmpName, v.bool);
Strings.Append ('>', tmpName, v.bool);
LineOut (INFILE, 'R', tmpName);
ELSE
*)
LineOut (INFILE, 'R', msg.refId^);
(* END; *)
END;
(* Maus 9.0: Distribution ausgeben *)
IF (msg.dist # data.dNone)
& ((msg.msgType = mail) OR
(msg.msgType = comment) OR
(msg.msgType = groupcomment))
THEN
LineOut (INFILE, 'D', CHR (ORD('K')+ORD(msg.dist)));
END;
(* Jetzt Kopien von eigenen Nachrichten suchen *)
FOR j := 0 TO Messages.messages - 1 DO
IF (Messages.msgArray^[j].msgType = copyOwn)
& (Messages.msgArray^[j].refNum = msg.number)
& Messages.msgArray^[j].sendMsg
& ~Messages.msgArray^[j].isSend
THEN
IF ~Messages.msgArray^[j].hdrRead
THEN
Messages.ReadHdrInfo (Messages.msgArray^[j], TRUE);
END;
IF Messages.msgArray^[j].hdrRead
THEN
LineOut (INFILE, 'K', Messages.msgArray^[j].receiver^);
(* $ ? Maus_9: erstmal ganz disabled
Messages.Number2Name (Messages.msgArray^[j].number, tmpName);
LineOut (INFILE, 'R', tmpName);
*)
IF (Messages.msgArray^[j].topic # NIL)
& (LENGTH(Messages.msgArray^[j].topic^) > 0)
THEN
LineOut (INFILE, '>', Messages.msgArray^[j].topic^);
END;
Messages.msgArray^[j].isSend := TRUE;
END;
END;
END;
(* billige Wildwestverkettung *)
IF msg.noRefLine & (msg.refId^[0] # '')
THEN
LineOut (INFILE, ':-', msg.refId^);
LineOut (INFILE, ':', '');
END;
(* Jetzt Messagetext ffnen *)
Messages.Number2Name (msg.number, msgName);
Strings.Append (CatTypes.textExt, msgName, v.bool);
IF TrickyOpen (MessagePath, msgName, mtTextfiles.READ, 16348, InHandle)
THEN
Transfer (InHandle, INFILE, ':');
mtTextfiles.CloseTextfile (InHandle);
IF ((msg.msgType = comment) OR (msg.msgType = groupcomment) OR (msg.msgType = mail))
THEN
Strings.Assign (msg.group^, tmpName, v.bool);
Strings.Upper (tmpName);
IF Strings.StrEqual (tmpName, devGroup)
THEN
LineOut (INFILE, ':', '---');
LineOut (INFILE, ':', 'CAT '+CatTypes.CatVersion+' vom '+CatTypes.CatDate+0C);
END;
END;
msg.isSend := TRUE;
ELSE
(* Header schon geschrieben! Abbruch und Fehlermeldung! *)
mtTextfiles.CloseTextfile (INFILE);
mtAppl.MouseArrow();
MTE.InfoAlert (MTE.noFile1, msgName, "|konnte nicht geffnet werden!|Das Infile wurde nicht korrekt erstellt.][[Abbruch]");
(* MTE.info (MTE.errorWithInfile); *)
RETURN FALSE
END;
ELSE (* IF msg.hdrRead *)
(* Fehlermeldung bringen! *)
Messages.Number2Name (msg.number, msgName);
Strings.Append (CatTypes.headerExt, msgName, v.bool);
MTE.InfoAlert (MTE.noFile1, msgName, MTE.noFile4);
END;
Messages.msgArray^[i] := msg;
END;
END; (* FOR *)
END;
mtTextfiles.WriteChar(INFILE, '#');
mtTextfiles.WriteLn(INFILE);
mtTextfiles.CloseTextfile(INFILE);
(* Jetzt vor dem Einpacken eventuelle andere Filter aufrufen
*)
IF ~IoFilter.IoFilterInfile()
THEN
mtAppl.MouseArrow();
RETURN FALSE;
END;
IF ARCName[0] # 0C THEN
res := ARCStarter.Archive();
MagicAES.EvntTimer(400);
IF (res # 0) & ~batchProcess
THEN
mtAppl.MouseArrow();
MTE.numAlert (res, MTE.pexecError);
RETURN FALSE
END;
END;
Protokoll.SendPathUpdate (MessagePath);
Protokoll.SendPathUpdate (ExportPath);
mtAppl.MouseArrow();
RETURN TRUE
END MakeInFile;
END MsgInfile.